/* 
泛型:
    定义函数/类/接口时, 不确定的类型, 使用时才指定具体类型
    指在定义函数、接口或类的时候，不预先指定具体的类型，而在使用的时候再指定具体类型的一种特性。

需求:
  创建一个函数, 实现功能: 根据指定的数量 count 和数据 value , 
  创建一个包含 count 个 value 的数组
*/

(() => {
  /* 
  泛型: 是一个不确定的类型

  泛型函数: 在函数上使用泛型
  1. 定义泛型: 定义函数时, 函数名的右侧  <泛型名称>   T / K / V
  2. 使用泛型: 参数/返回/函数体中使用
  3. 指定泛型的具体类型: 调用函数时, 函数名的右侧 <具体类型名>
  */

  function createArray<T>(count: number, value: T): T[] {
    const arr: T[] = []
    for (let index = 0; index < count; index++) {
      arr.push(value)
    }
    return arr
  }

  const arr3 = createArray<number>(3, 12.34)
  console.log(arr3[1].toFixed()) // 有提示了
  const arr4 = createArray<string>(3, 'atguigu')
  console.log(arr4[2].length) // 有提示了

})();

(() => {
  function fn<K, V>(a: K, b: V): [K, V] { // a = 2 b = 'abc'
    return [a, b]
  }

  console.log(fn<number, string>(2, 'abc'))
  const result = fn<string, number>('abc', 23)

  // function fn2() {
  //   return 1
  //   return {}
  //   return 'abc'
  // }
})();


(() => {
  function createArray(count: number, value: any): any[] {
    const arr: any[] = []
    for (let index = 0; index < count; index++) {
      arr.push(value)
    }
    return arr
  }
  const arr1 = createArray(3, 12.23)
  // console.log(arr1[1].toFixed2())

  const arr2 = createArray(3, 'abcd')
  // console.log(arr2[1].length2)

  /* 
  不用泛型的问题
  1. 正确的语法没补全提示
  2. 错误的语法没有错误提示
  */

})();
